Parallel/distributed applications can be composed of several functions running in parallel and interacting with each other in order to perform a defined task. The design of such complex systems requires effort especially concerning handling of the integrity of system behavior and the definition of a protocol for interaction between parallel tasks. Interactions between tasks must be synchronized in order to handle data integrity. Moreover, communication between machines has to be performed using network protocols and in a synchronized manner in the network.
The development of parallel/distributed applications can be set up in several ways and supported by conventional tools. A conventional process followed in the development of such applications or systems is shown in FIG. 9.
A process for developing parallel/distributed applications may have cycles or may iterate during the development of the system. The development may continue during the life of the system. Requirements of the design phase can include definition of global functions of the system, subdivision of the system into parallel sub-tasks, definition of critical conditions that may occur in sub-process interaction, and analysis of dangerous conditions such as deadlock. Requirements of the development phase can include handling of parallel processes, handling of parallel threads, handling of shared data, and handling of semaphores, lock mechanisms and conditional variables. Requirements of a test/monitoring phase can include definition of mechanisms that allow users to understand system behavior in order to solve problems or find and remove bugs in the system.
Part of the development/debugging time can be saved depending on the type of libraries used. Libraries like PTHREAD can be used for the handling of threads and the most general lock mechanisms for synchronization. See David R. Butenhof. Programming with POSIX Threads, Addison Wesley Publishing, 2000, which is incorporated by reference herein in its entirety. The usage of such a library requires deep knowledge of parallel programming. Further, applications developed with this library are prone to errors. Other libraries, such as ACE, PVM and MPI, also attempt to solve the problems related to parallel execution and data exchange in parallel/distributed computing. See Douglas C. Schmid and Stephen D. Houston, C++ Network Programming, volume Vol. 1: Master Complexity with ACE and Patterns, Addison Wesley Publishing, 2002; Al Geist, Adam Beguelin, Jack Dongarra, Weicheng Jiang, Robert Manchek, Vaidy Sunderam, PVM: Parallel Virtual Machine, A Users' Guide and Tutorial for Networked Parallel Computing, MIT Press, Cambridge, Mass., USA, 1994; Marc Snir, Steve Otto, Steven Huss-Lederman, David Walker and Jack Dongarra, MPI: The complete reference, MIT Press, Cambridge, Mass., USA, http://www.netlib.org/utk/papers/rnpi-book.html, 1996, which are all incorporated by reference herein in their entirety. Although these libraries address issues of parallel programming, they still leave a certain amount of work to the user. Moreover, the usage of such libraries does not enforce modularization or clear design, leaving these aspects to the responsibility of the user.
Another way of supporting the development of parallel/distributed applications is provided by tools such as Rhapsody or Rational Rose. See http://www.ilogix.com; Wendy Boggs, Michael Boggs, Mastering UML with Rational Rose 2.0, Sybex Books, 2002, which are all incorporated by reference herein in their entirety. These tools employ a modular approach and a more comprehensive design by the usage of Unified Modeling Language (hereinafter “UML”). However, these tools leave to the user the definition and implementation of many important aspects, for example communication, parallel processing and synchronization. Their goal is to include a programming language in an integrated development environment that can cover the design, coding and test phases, while still leaving a large degree of freedom to the user.
Another tool that covers the design phase and the development phase with a modular approach (partitioning of data and computation) is ControlShell. See Real-Time Innovation, ControlShell User's Manual, Version 7.0, Real-Time Innovation Inc., California, 2001, which is incorporated by reference herein in its entirety. With this tool it is possible to design and develop applications at the same time by the composition of several types of modules. This tool is able to handle parallel/distributed applications, but since it has been designed specifically for control systems, the handling of the modules is under the control of sample-rate units that control the module's execution directly (synchronous mode) or indirectly through a state machine (asynchronous mode). Moreover, handling of data synchronization between threads is left to the user.